package co.edu.uniandes.ecos.itera.tsp.accesodatos;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avance;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avances;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogD;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogInt;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogsD;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Tiempos;
import co.edu.uniandes.ecos.itera.tsp.mundo.Etapa;
import co.edu.uniandes.ecos.itera.tsp.mundo.Interrupcion;



@LogInt(date = "2011-0313", intId = 10, min = 60, taskId = 2)
@Tiempos({
	@LogT(date="2011-03-13", min=50, taskId=2),
	@LogT(date="2011-03-19", min=7, taskId=111)
})
@Avances({
	@Avance(taskId=2, termino='S'),
	@Avance(taskId=12, termino='S')
})
@LogD(etapaInyectada = Etapa.INSPECCION, idDefecto=4, taskId=12)
public class InterrupcionDAL implements Serializable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 6623696458882706172L;
	/**
	 * Atributos
	 */
	
	/**
	 * Almacenamiento de la ruta del archivo donde se va a persistir
	 */
	String rutaArchivoPersistencia = "./datos/Interrupcion";
	
	/**
	 * Serializar o persistir la lista de interrupciones en un archivo
	 * @param listInterrupciones Lista de interrupciones
	 * @throws Exception
	 */
	@LogsD({
		@LogD(etapaInyectada = Etapa.INSPECCION, idDefecto=12, taskId=12),
		@LogD(etapaInyectada = Etapa.INSPECCION, idDefecto=12, taskId=12),
		@LogD(etapaInyectada = Etapa.INSPECCION, idDefecto=12, taskId=12)
	})	
	@Loc(size = 10, taskId = 2)
	public void serializar (ArrayList<Interrupcion> listInterrupciones) throws Exception
	{
		try
		{
		    ObjectOutputStream manejadorArchivo = new ObjectOutputStream( new FileOutputStream( rutaArchivoPersistencia) );
		    manejadorArchivo.writeObject( listInterrupciones );
		    manejadorArchivo.close( );
		}
		catch( IOException e )
		{
		    throw  e;
		}

	}
	
	/**
	 * deserializa de un archivo en la ruta especificada las interrupciones antes serializadas 
	 * @return retorna lista de interrupciones
	 * @throws Exception
	 */
	@Loc(size = 12, taskId = 2)
	@SuppressWarnings("unchecked")
	public ArrayList<Interrupcion> deSerializar() throws Exception
	{
		ArrayList<Interrupcion> listInterrupciones = new ArrayList<Interrupcion>();
		try
		{
		    ObjectInputStream lecturaArchivo = new ObjectInputStream( new FileInputStream( this.rutaArchivoPersistencia ) );
		    listInterrupciones = ( ArrayList<Interrupcion> )lecturaArchivo.readObject( );
		    lecturaArchivo.close( );
		}
		catch( Exception e )
		{
		    throw e;
		}
		return listInterrupciones;
	}
}
